home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / amag / 9301b.lha / Schach / Sourcecode / Brett.c < prev    next >
C/C++ Source or Header  |  1992-12-15  |  5KB  |  189 lines

  1. /*
  2.  * Die Funktionen Dateiausdrucken und SpielstaerkeAnzeige
  3.  * von rz am 15/12/92 zusätzlich implementiert, ebenso
  4.  * die Ausgabe des aktuellen Status in der Screenleiste
  5.  */
  6.  
  7. /* Brett.c */
  8.  
  9. #include "Adt.h"
  10.  
  11. extern void SpielstaerkeAnzeige(void);
  12.  
  13. struct Ereignis * WarteEreignis();
  14. struct Zugstat * BesterZug();
  15.  
  16.  /* globales Spielbrett: */
  17. Figur s[ 9 ][ 9 ];
  18.  
  19.  /* Spielstärke: 2 = leicht, 3 = schwerer etc. */
  20. int Spielstaerke=2;
  21.  
  22. main()
  23. {
  24.     int i, j, spende;
  25.     struct Ereignis *e;
  26.     struct Zugstat *zs;
  27.     Special sp;
  28.  
  29.     OeffneDisplay();
  30.     if( !WillLaden( s, &sp ) ) {
  31.  
  32.          /* Spielbrett initialisieren: */
  33.         s[ 1 ][ 1 ] = wturm;        s[ 1 ][ 8 ] = sturm;
  34.         s[ 2 ][ 1 ] = wspringer;    s[ 2 ][ 8 ] = sspringer;
  35.         s[ 3 ][ 1 ] = wlaeufer;     s[ 3 ][ 8 ] = slaeufer;
  36.         s[ 4 ][ 1 ] = wdame;        s[ 4 ][ 8 ] = sdame;
  37.         s[ 5 ][ 1 ] = wkoenig;      s[ 5 ][ 8 ] = skoenig;
  38.         s[ 6 ][ 1 ] = wlaeufer;     s[ 6 ][ 8 ] = slaeufer;
  39.         s[ 7 ][ 1 ] = wspringer;    s[ 7 ][ 8 ] = sspringer;
  40.         s[ 8 ][ 1 ] = wturm;        s[ 8 ][ 8 ] = sturm;
  41.         for( i=1; i<=8; i++ ){
  42.             s[ i ][ 2 ] = wbauer;   s[ i ][ 7 ] = sbauer;
  43.             for( j=3; j<=6; j++ )
  44.                 s[ i ][ j ] = leer;
  45.         }
  46.         sp = wroch | sroch;
  47.     }
  48.  
  49.     ZeichneBrett( s, weiss );
  50.  
  51.     SpielstaerkeAnzeige();
  52.  
  53.     spende = 0;
  54.     while( 1 ) {
  55.         e = WarteEreignis( s, weiss );
  56.         switch( e->ereignistyp ) {
  57.         case zugs:
  58.             if( !spende ) {
  59.                 ZeichneStat( s, 0L );
  60.                 ZeichneZug( s, &(e->zug), weiss, &sp );
  61.                 if( IstSchach( s, schwarz, 0, sp ) )
  62.                     if( IstMatt( s, schwarz, sp ) ) {
  63.                             NotierAdd( "++" );
  64.                             NotierZug( "-Matt-" );
  65.                             spende = 1; break;
  66.                         } else
  67.                             NotierAdd( " +" );
  68.                 if( IstPatt( s, schwarz, sp ) ) {
  69.                     NotierZug( "-Patt-" );
  70.                     spende = 1; break;
  71.                 }
  72.                 zs = BesterZug( s, schwarz, Spielstaerke, sp );
  73.                 ZeichneZug( s, &(zs->zug), weiss, &sp );
  74.                 ZeichneStat( s, zs );
  75.                 if( IstSchach( s, weiss, 0, sp ) )
  76.                     if( IstMatt( s, weiss, sp ) ) {
  77.                         NotierAdd( "++" );
  78.                         NotierZug( "-Matt-" );
  79.                         spende = 1; break;
  80.                     } else
  81.                         NotierAdd( " +" );
  82.                 if( IstPatt( s, weiss, sp ) ) {
  83.                     NotierZug( "-Patt-" );
  84.                     spende = 1; break;
  85.                 }
  86.             }
  87.             break;
  88.         case ende:
  89.             if( WillBeenden( s, sp ) ) {
  90.                 SchliesseDisplay();
  91.                 exit( 0 );
  92.             }
  93.             break;
  94.         }
  95.     }
  96. }
  97.  
  98. ZeichneZug( s, z, fa, sp )
  99.     Figur s[ 9 ][ 9 ];
  100.     struct Zug *z;
  101.     Farbe fa;
  102.     Special *sp;
  103. {
  104.     char notat[ 7 ], *st;
  105.     int sx, sy, zx, zy;
  106.     Figur fi;
  107.  
  108.      /* ausführliche Notation: */
  109.     switch( z->figur & figmask ) {
  110.     case bauer:     notat[ 0 ] = ' ';   break;
  111.     case springer:  notat[ 0 ] = 'S';   break;
  112.     case laeufer:   notat[ 0 ] = 'L';   break;
  113.     case turm:      notat[ 0 ] = 'T';   break;
  114.     case dame:      notat[ 0 ] = 'D';   break;
  115.     case koenig:    notat[ 0 ] = 'K';   break;
  116.     }
  117.     sx = z->start >> 4; sy = z->start & yposmask;
  118.     zx = z->ziel >> 4;  zy = z->ziel & yposmask;
  119.     notat[ 1 ] = sx-1+'a';
  120.     notat[ 2 ] = sy+'0';
  121.     notat[ 3 ] = s[ zx ][ zy ] == leer ? '-' : 'x';
  122.     notat[ 4 ] = zx-1+'a';
  123.     notat[ 5 ] = zy+'0';
  124.     notat[ 6 ] = 0;
  125.     st = ( notat[ 0 ] == ' ' ) ? &(notat[ 1 ]) : notat;
  126.  
  127.      /* Special - Variable aktualisieren: */
  128.     *sp &= ~epmask;
  129.     if( (z->figur&figmask)==bauer && (zy-sy==2 || sy-zy==2) )
  130.     *sp |= sx;
  131.     if( (z->figur&figmask)==koenig )
  132.     if( (z->figur&farbmask)==weiss )
  133.         *sp &= ~wroch;
  134.     else
  135.         *sp &= ~sroch;
  136.     if( (z->figur&figmask)==turm )
  137.     if( (z->figur&farbmask)==weiss ) {
  138.         if( sx==1 )
  139.         *sp &= ~wlroch;
  140.         else if( sx==8 )
  141.         *sp &= ~wkroch;
  142.     } else
  143.         if( sx==1 )
  144.         *sp &= ~slroch;
  145.         else if( sx==8 )
  146.         *sp &= ~skroch;
  147.  
  148.      /* Zug ausführen */
  149.     fi = s[zx][zy]; s[sx][sy] = leer;
  150.     if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) ) {
  151.     s[zx][zy] = z->figur;
  152.     if( zx==7 ) {
  153.         s[6][sy] = s[8][sy]; s[8][sy] = leer;
  154.         NotierZug( "O-O" );
  155.     } else {
  156.         s[4][sy] = s[1][sy]; s[1][sy] = leer;
  157.         NotierZug( "O-O-O" );
  158.     }
  159.     } else if( (z->figur&figmask)==bauer && fi==leer && sx!=zx ) {
  160.     s[zx][zy] = z->figur; s[zx][sy] = leer;
  161.     notat[3] = 'x';
  162.     NotierZug( st );
  163.     NotierAdd( "ep" );
  164.     } else if( (z->figur&figmask)==bauer && (zy==1 || zy==8) ) {
  165.     s[zx][zy] = (z->figur&farbmask)|dame;
  166.     NotierZug( st );
  167.     NotierAdd( "D" );
  168.     } else {
  169.     NotierZug( st );
  170.     s[zx][zy] = z->figur;
  171.     }
  172.  
  173.      /* Zug sichtbar machen: */
  174.     BlinkFeld( z->start, fa );
  175.     ZeichneFigur( leer, z->start, fa );
  176.     ZeichneFigur( s[ zx ][ zy ], z->ziel, fa );
  177.     if( (z->figur&figmask)==koenig && (zx-sx==2 || sx-zx==2) )
  178.     if( zx-sx==2 ) {
  179.         ZeichneFigur( s[8][sy], 8<<4|sy, fa );
  180.         ZeichneFigur( s[6][sy], 6<<4|sy, fa );
  181.     } else {
  182.         ZeichneFigur( s[1][sy], 1<<4|sy, fa );
  183.         ZeichneFigur( s[4][sy], 4<<4|sy, fa );
  184.     }
  185.     if( (z->figur&figmask)==bauer && sx!=zx )
  186.     ZeichneFigur( s[zx][sy], zx<<4|sy, fa );
  187.     BlinkFeld( z->ziel, fa );
  188. }
  189.